package org.jeecg.common.util;

import cn.hutool.core.collection.ListUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.lionsoul.jcseg.ISegment;
import org.lionsoul.jcseg.dic.ADictionary;
import org.lionsoul.jcseg.dic.DictionaryFactory;
import org.lionsoul.jcseg.extractor.impl.TextRankKeywordsExtractor;
import org.lionsoul.jcseg.segmenter.SegmenterConfig;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;

/**
 * 分词助手
 *
 * @author Yafei Song
 * @date 2022/09/27
 */
@Slf4j
@Component
public class ParticipleHelper {

    /**
     * 分词核心配置类
     */
    private final SegmenterConfig config;


    /**
     * 构建TextRankKeywordsExtractor关键字提取器
     */
    private TextRankKeywordsExtractor extractor;

    /**
     * 分词助手 初始化默认配置
     * <p>
     * 设置过滤停止词 : true
     * 设置关闭同义词追加: false
     * 设置去除不识别的词条: false
     * </p>
     */
    public ParticipleHelper() {
        config = new SegmenterConfig(true);
        //设置过滤停止词
        config.setClearStopwords(true);
        //设置关闭同义词追加
        config.setAppendCJKSyn(false);
        //设置去除不识别的词条
        config.setKeepUnregWords(false);
    }

    /**
     * 分词助手
     *
     * @param clearStopwords 设置过滤停止词
     * @param appendCJKSyn   设置关闭同义词追加
     * @param keepUnregWords 设置去除不识别的词条
     */
    public ParticipleHelper(boolean clearStopwords, boolean appendCJKSyn, boolean keepUnregWords) {
        config = new SegmenterConfig(true);
        //设置过滤停止词
        config.setClearStopwords(clearStopwords);
        //设置关闭同义词追加
        config.setAppendCJKSyn(appendCJKSyn);
        //设置去除不识别的词条
        config.setKeepUnregWords(keepUnregWords);
    }

    /**
     * 分词助手
     * 传入核心配置
     *
     * @param config 配置
     */
    public ParticipleHelper(SegmenterConfig config) {
        this.config = config;
    }

    /**
     * 初始化
     */
    @PostConstruct
    public void init() {
        ADictionary dic = DictionaryFactory.createSingletonDictionary(config);
        ISegment seg = ISegment.COMPLEX.factory.create(config, dic);

        //2, 构建TextRankKeywordsExtractor关键字提取器
        extractor = new TextRankKeywordsExtractor(seg);
        //设置pagerank算法最大迭代次数，非必须，使用默认即可
        extractor.setMaxIterateNum(100);
        //设置textRank计算窗口大小，非必须，使用默认即可
        extractor.setWindowSize(5);
        //设置最大返回的关键词个数，默认为10
        extractor.setKeywordsNum(10);
    }


    /**
     * 关键字提取
     *
     * @param str str
     * @return {@link List}<{@link String}>
     */
    public List<String> keywordExtraction(String str) throws IOException {
        if (StringUtils.isBlank(str)) {
            return ListUtil.empty();
        }
        return extractor.getKeywords(new StringReader(str));
    }
}
